"""
https://ke.qq.com/course/292490?tuin=d4c97e25&taid=13759941345310346

目的  抓取字段
字段名
1抓取评论
2以及评论人
3和他的id


流程
分析
通过抓包发现数据包 是json格式的数据
需要用到处理的模块 json jsonpath
发送请求 必不可少的模块 requests

确认url 以及方法
发送请求
获取响应
清洗数据
在构建有headers和确认用户身份的cookie发送get请求   发现依然没有返回真实数据
返回了 {"msg":"refer错误","type":1,"retcode":100101}    被反扒了

referer  请是构建http请求的参数
referer n: 防盗链
在这里的作用表示 本次请求 从哪里来的意思
服务端就回去检测本次请求 是否是从域名下的资源路径来的   服务端的验证
if referer 在我的服务器的域名资源地址内:
    返回本次请求的数据
else（不是从本域名下的资源路径来的 就不返回数据 ）:

所以 要想反反爬 就需要把 referer字段加入到http请求里面 发送
referer怎么获取
在抓包的位置   找requests.headers  里面的referer字段

小tips1 由于评论的sheet 是刷新过后不是默认打开的sheet，但是评论sheet是需要单独点击的
所以 需要清空数据包  单独点击 评论sheet 完成异步加载请求 在network抓包
小tips2  抓ajax的数据包会出现 没有数据包生成  可能是有缓存的原因 就不生成数据包
如何解决    重新刷新页面 重新点击评论



"""
import json
from jsonpath import jsonpath
import requests


# 1确认url 以及方法
def crawl_data(page):
    # 包含评论的url
    url = f"https://ke.qq.com/cgi-bin/comment_new/course_comment_list?cid=292490&count=10&page={page}&filter_rating=0&bkn=&r=0.7579288037665699"
    # 请求头
    headers = {
        "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.84 Safari/537.36",
        'cookie': 'tvfe_boss_uuid=3a974c9f273b9598; pgv_pvid=5270733150; RK=s5XVhIvR/H; ptcz=571dbff3245ca3b337c7f002d20e8120c92a130b3bc021d419372c3d6ff122d0; luin=o3569974821; ptui_loginuin=2810770620; ke_login_type=1; iswebp=1; ts_uid=8574552847; lskey=000100007dd8832a756f36c5c89cec2befa2eaedae801cd020629756a5abae4acd5bce2d6121c4de01ecee48; o_cookie=3569974821; eas_sid=O1C6e417f6R835b7n2p5T6j1c2; ts_refer=sixstar.ke.qq.com/; course_origin=[{"cid":292490,"ext":{"pagelocation":"newagencyhome%2C1.1.2"}}]; tdw_auin_data=3569974821; tdw_data_testid=; tdw_data_flowid=; tdw_first_visited=1; pgv_info=ssid=s2709152062; ts_last=ke.qq.com/course/292490; Hm_lvt_0c196c536f609d373a16d246a117fd44=1646994777,1646995755,1648803178,1648815266; sessionPath=164881533797584811395203; tdw_data_new_2={"auin":"3569974821","sourcetype":"tuin","sourcefrom":"d4c97e25","ver9":"","uin":"","visitor_id":"7024211062082064","ver10":"","url_page":"","url_module":"","url_position":"","sessionPath":"164881533797584811395203"}; tdw_data={"ver4":"4","ver5":"","ver6":"","refer":"","from_channel":"","path":"h-0.7451965689485316","auin":"3569974821","uin":"","real_uin":""}; Hm_lpvt_0c196c536f609d373a16d246a117fd44=1648815340',
        "referer": "https://ke.qq.com/course/292490?tuin=d4c97e25&taid=13759941345310346",
        "x-requested-with": "XMLHttpRequest"
    }
    #     发送请求 获取响应
    response = requests.get(url=url, headers=headers).json()
    # 注意 在以上代码最后加上了.json  那么返回的response对象就直接被转换成了 json类型的数据 >>>dict
    # 那么这个response对象就没有了 content.decode()的方法
    # 不是说任何请求都可以直接在最后加 .json()  只有确认了是json格式数据的请求 才能在最后加上.json()
    print(type(response))
    # data=response.content.decode()

    #     对数据进行清洗
    # 1以及评论人
    nick_name = jsonpath(response, "$..nick_name")
    # 2和他的id
    id = jsonpath(response, "$..id")
    #    3抓取评论
    first_comment = jsonpath(response, "$..first_comment")
    print(nick_name, len(nick_name))
    print(id, len(id))
    print(first_comment, len(first_comment))
    item={}
    with open("评论2.json", "a", encoding="utf-8")as f:
        for data in zip(nick_name, id, first_comment):
            # item = {"nick_name": data[0],
            #         "id": data[1],
            #         "first_comment": data[2]}
            item["nick_name"]=data[0]
            item["id"]=data[1]
            item["first_comment"]=data[2]
            str_data=json.dumps(item,ensure_ascii=False,indent=3)
            f.write(str_data+",\n")


if __name__ == '__main__':
    page=int(input("翻页数量:"))
    for i in range(page):
        crawl_data(i)
